<?php

declare(strict_types=1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;

/**
 * 一键从数据表生成 MVC 文件
 * @version 1.0.0-alpha.220507
 * 使用说明：
 * php think esmvc --table=auth_admins --object=m,v,c,r,p # 读取 auth_admins 数据表，生成对应的 MVC 文件到 admin 应用子目录。
 * php think esmvc --table=?tbl_nothingness --object=all # 模拟一个空白表(只有id, name, status, created_at, updated_at字段)，并生成对应 MVC 文件到 admin 应用子目录。
 * php think esmvc --table=auth_admins --object=p --remove=y # 删除 auth_admins 数据表的菜单权限规则。
 * php think esmvc --table=auth_admins --object=v --force=y # 强制重新覆盖 auth_admins 数据表的视图文件到到 admin 应用子目录。
 * php think esmvc --table=ec_goods --app=mchadmin --object=all # 读取 ec_goods 数据表，生成对应的 MVC 文件到 mcadmin 应用子目录。
 * 注意事项：
 * 1. --table 参数值加前缀 ?，表示这是一个不存在的数据表。例如 --table=?tbl_nothingness。
 * 2. 以数据表的前缀名称划分模块文件目录和模块菜单层级，方便自动生成代码的时候区分模块归属关系。
 * 3. 支持多应用开发，通过指定 --app 参数设置应用子目录，默认缺省生成到 admin 应用子目录。例如 --app=[admin:通用后台,mchadmin:商户后台,agadmin:代理后台,api=公共接口]
 * 4. 生成的文件位置：
 *      - 控制器位于 /app/controller/{app}/{module}/{name}.php
 *      - 模型类位于 /app/model/{app}/{module}/{name}Model.php
 *      - 视图文件位于 /public/{app}/{module}/{name}/index.html 和 /resources/vepadmin/src/views/{app}/{module}/{name}/Index.vue
 *      - 路由文件位于 /route/{app}.php
 */
class EsMvc extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('esmvc')
            ->addArgument('table', Argument::OPTIONAL, '数据表名称', '')
            ->addOption('app', 'a', Option::VALUE_REQUIRED, '应用名称', 'admin')
            ->addOption('table', 't', Option::VALUE_REQUIRED, '数据表名称', '')
            ->addOption('object', 'o', Option::VALUE_REQUIRED, '目标对象(m=模型文件,v=视图文件,c=控制器文件,r=路由文件,p=权限规则', 'all')
            ->addOption('force', 'f', Option::VALUE_REQUIRED, '是否强制覆盖', 'N')
            ->addOption('remove', 'r', Option::VALUE_REQUIRED, '是否删除', 'N')
            ->setDescription('the esmvc command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 指令输出
        // $output->writeln('esmvc');
        $app = $input->getOption('app');
        $table = $input->getArgument('table');
        if (!$table) {
            $table = $input->getOption('table');
        }
        if (!$table) {
            $output->writeln('--table 参数必须填写。');
            return;
        }

        $object = $input->getOption('object');
        $isForce = strtoupper($input->getOption('force')) == 'Y';
        $isRemove = strtoupper($input->getOption('remove')) == 'Y';
        $this->main($app, $table, $object, $isForce, $isRemove);
    }

    public function main($app, $table, $object, $isForce, $isRemove)
    {
    }
}
